// 定义跟菜谱相关的路由
const Router = require('koa-router');
// 创建一个新的 Router实例
const router = new Router();
const axios = require('axios')
const { verify } = require('../utils/jwt.js');
const endpoint = 'https://api.deepseek.com/v1/chat/completions'

const { getAllCooks, addCook, getCookById, deleteCook, publishCook } = require('../controllers/index.js');

router.prefix('/cook')

// 使用deepseek获取做菜步骤
router.get('/generateStep', async (ctx) => {
  const { cookName } = ctx.query
  const message = `请提供${cookName}的具体烹饪步骤，要求如下：
1. 总共不超过6个步骤；
2. 每一步骤应该在50到70字之间，详细描述该步骤的操作；
3. 请在每一步骤前加上'#'号，以区分不同的步骤，该步骤不超过6个。
例如，对于西红柿炒鸡蛋这道菜，我希望得到类似以下格式的结果：
# 选择新鲜的西红柿2个和鸡蛋4个。将西红柿洗净后切成小块；鸡蛋打入碗中，加入少许盐搅拌均匀。
# 热锅凉油：锅中倒入适量食用油，开中火加热。待油温升高后，轻轻倒入打好的鸡蛋液，快速翻炒至七八成熟后盛出。
...
请根据上述要求提供${cookName}的烹饪步骤。`
  const data = {
    model: 'deepseek-r1:1.5b', // 模型名称
    messages: [
      {
        role: 'user', // 角色
        content: `${message}`
      }
    ],
    stream: false // 是否流式返回
  }
  // 跟 deepseek 模型进行通信
  const response = await axios.post("http://localhost:11434/api/chat", data)

  const jsonString = response.data.message.content;

  try {
    ctx.body = {
      code: 200,
      msg: jsonString,
      message: '生成成功'
    }
  } catch (error) {
    ctx.body = {
      code: 500,
      message: '返回数据格式有误'
    }
  }
})

// const message = `请提供${cookName}的具体烹饪步骤，要求如下：
//   1. 总共不超过6个步骤；
//   2. 每一步骤应该在50到70字之间，详细描述该步骤的操作；
//   3. 请在每一步骤前加上'#'号，以区分不同的步骤，该步骤不超过6个。
//   例如，对于西红柿炒鸡蛋这道菜，我希望得到类似以下格式的结果：
//   # 选择新鲜的西红柿2个和鸡蛋4个。将西红柿洗净后切成小块；鸡蛋打入碗中，加入少许盐搅拌均匀。
//   # 热锅凉油：锅中倒入适量食用油，开中火加热。待油温升高后，轻轻倒入打好的鸡蛋液，快速翻炒至七八成熟后盛出。
//   ...
//   请根据上述要求提供${cookName}的烹饪步骤。`
// router.get('/generateStep', async (ctx) => {
//   const { cookName } = ctx.query;
//   console.log(cookName);

//   const message = `请提供${cookName}的具体烹饪步骤，要求如下：
//   1. 总共不超过6个步骤；
//   2. 每一步骤应该在50到70字之间，详细描述该步骤的操作；
//   3. 请在每一步骤前加上'#'号，以区分不同的步骤，该步骤不超过6个。
//   例如，对于西红柿炒鸡蛋这道菜，我希望得到类似以下格式的结果：
//   # 选择新鲜的西红柿2个和鸡蛋4个。将西红柿洗净后切成小块；鸡蛋打入碗中，加入少许盐搅拌均匀。
//   # 热锅凉油：锅中倒入适量食用油，开中火加热。待油温升高后，轻轻倒入打好的鸡蛋液，快速翻炒至七八成熟后盛出。
//   ...
//   请根据上述要求提供${cookName}的烹饪步骤。`

//   const data = {
//     model: 'deepseek-r1:1.5b',
//     messages: [
//       {
//         role: 'user',
//         content: message,
//       },
//     ],
//     stream: true, // 启用流式返回
//   };

//   try {
//     const response = await axios.post("http://localhost:11434/api/chat", data, {
//       responseType: 'stream'
//     });

//     ctx.set('Content-Type', 'text/event-stream'); // 设置适当的 Content-Type
//     ctx.set('Cache-Control', 'no-cache');
//     ctx.set('Connection', 'keep-alive');

//     ctx.res.write('data: \n\n'); // 初始化 SSE 连接

//     response.data.on('data', chunk => {
//       const decodedChunk = chunk.toString(); // 将 Buffer 转换为字符串

//       // 发送数据时添加 SSE 协议所需的前缀
//       ctx.res.write(`data: ${decodedChunk}\n\n`);
//     });

//     response.data.on('end', () => {
//       ctx.res.end(); // 结束响应
//     });

//     response.data.on('error', error => {
//       ctx.throw(500, 'Stream processing error');
//     });
//   } catch (error) {
//     ctx.throw(500, 'Failed to communicate with the model');
//   }
// });

// 获取我的食谱
router.get('/getAllCooks', verify(), async (ctx, next) => {
  try {
    const { id } = ctx.query
    const res = await getAllCooks(id)
    if (res.length) {
      ctx.body = {
        code: 200,
        data: res,
        message: '查询成功'
      }
    } else {
      ctx.body = {
        code: 200,
        data: [],
        message: '暂无数据'
      }
    }
  } catch (error) {
    ctx.body = {
      code: 500,
      data: error,
      message: '服务器异常'
    }
  }
})

// 添加一个食谱
router.post('/addCook', verify(), async (ctx, next) => {
  const { userId, steps } = ctx.request.body
  const res = await addCook(userId, steps)

  try {
    if (res.note === 1) {
      ctx.body = {
        code: 200,
        note: res.note,
        message: '已经添加过'
      }
    } else if (res) {
      ctx.body = {
        code: 200,
        note: res.note,
        message: '添加成功'
      }
    } else {
      ctx.body = {
        code: 500,
        message: '添加失败'
      }
    }
  } catch {
    ctx.body = {
      code: 500,
      message: '服务器异常'
    }
  }

})

// 根据id获取菜谱
router.get('/getCookById', verify(), async (ctx, next) => {
  const { id } = ctx.query
  const username = ctx.username
  const res = await getCookById(id, username)

  try {
    ctx.body = {
      code: 200,
      data: res,
      message: '查询成功'
    }
  } catch (error) {
    ctx.body = {
      code: 500,
      data: error,
      message: '服务器异常'
    }
  }
})

// deepseek获取每日推荐
router.get('/getRecommend', async (ctx, next) => {
  const msg = '请帮我推荐一道菜，并提供以下信息：该菜的图片URL、菜品名称、简短描述（8个字）、制作所需时间、制作难度等级。请将这些信息以JSON格式返回。例如{"image":"https://imgs.699pic.com/images/500/712/940.jpg!list1x.v2","name":"菜品名称","description":"菜品描述（8个字，优雅一点）,"time":"制作时长","difficulty":"制作难度"}'
  const data = {
    model: 'deepseek-r1:1.5b', // 模型名称
    messages: [
      {
        role: 'user', // 角色
        content: msg
      }
    ],
    stream: false // 是否流式返回
  }
  // 跟 deepseek 模型进行通信
  const response = await axios.post("http://localhost:11434/api/chat", data)
  // console.log(response.data.message.content);

  const content = response.data.message.content;
  // 使用正则表达式移除<think>标签和其内部的所有内容
  const text = content
  const startIndex = text.indexOf('{');
  const endIndex = text.lastIndexOf('}') + 1;
  const jsonString = text.substring(startIndex, endIndex);
  try {
    ctx.body = {
      code: 200,
      data: jsonString,
      message: '查询成功'
    }
  } catch (error) {
    ctx.body = {
      code: 500,
      message: '返回数据格式有误'
    }
  }
})


// 根据id删除某个菜
router.get('/deleteCookById', async (ctx, next) => {
  const { id } = ctx.query
  const username = ctx.username

  try {
    await deleteCook(id, username)
    ctx.body = {
      code: 200,
      message: '删除成功'
    }
  } catch (error) {
    ctx.body = {
      code: 500,
      message: '服务器异常'
    }
  }
})

router.get('/generateImg', async (ctx, next) => {
  const { msg, size } = ctx.query
  async function generateImg(msg, size) {
    try {
      const response = await axios.post('https://open.bigmodel.cn/api/paas/v4/images/generations', {
        model: 'cogview-3-flash',
        prompt: `${msg}`,
        size: `${size}`
      }, {
        headers: {
          'Authorization': 'b72aef143aa04df5926766760d422d49.DnNbKZcDbEEN3AiQ',
          'Content-Type': 'application/json'
        }
      });
      console.log(response.data.data[0].url)
      return response.data.data[0].url;
    } catch (error) {
      console.log('生成图片失败');
    }
  }
  try {
    const url = await generateImg(msg, size); // 使用await等待异步函数完成
    ctx.body = {
      code: 200,
      url: url
    };
  } catch (error) {
    ctx.body = {
      code: 500,
      message: '生成图片失败'
    };
  }
})

module.exports = {
  cookRouter: router
};